package com.wpp;

/*
 * 1.什么是数据库事务？
 *   事务:一组逻辑操作单元，使数据从一组状态变换到另一种状态
 * 2.事务处理：
 *       要么就全部成功(commit)，要么就全部失败(rollback)
 * ps:数据一旦提交，就不可回滚
 * 3.哪些操作会导致数据自动提交？
 *       >DDL操作一旦执行，就会自动提交
 *       >DML默认提交下，一旦执行，就会提交。
 *           >但是我们可以通过设置的方式取消DML操作的自动提交
 *       >默认在关闭连接的时候，也会把未提交的事务一起自动提交
 *
 * 解决办法方式一：
 *       共用一个connection连接，取消数据的自动提交，手动提交数据，出异常了就回滚数据
 *
 *
 * 事务的ACID属性
 *   1.原子性(Atomicity)
 *       原子性是指事务是一个不可分割的工作单位，事务中的操作要么都发生，要么都不发生
 *
 *   2.一致性(Consistency)
 *       事务必须使数据库从一个一致性状态变换到另外一个一致性状态
 *
 *   3.隔离性(Lsolation)
 *       事务的隔离性是指一个事务的执行不能被其他事务干扰，即一个事务内部的操作及使用的数据对并发的其他事务是隔离的，并发执行的各个事务之间是不能互相干扰的
 *
 *   4.持久性(Durability)
 *       持久性是指一个事务一旦提交，它对数据库中数据的改变是永久性的，接下来的其他 操作和数据库的故障都不会对它有任何影响
 *
 * 数据库的并发问题
 *   对于同时运行的多个事务，这些事务访问数据库中相同的数据时，如果没有采取必要的隔离机制，就会导致各种并发问题：
 *       脏读：T1事务需要读取表中的一个数据，然后T2更新了表中的数据，但是数据没有提交，T1此时读取的是未提交的数据，所以他读取的内容是临时且无效的，这就叫脏读
 *       不可重复读：T1事务查询表中的数据为1，但是事务没有关闭，此时T2事务更新了表中的数据为2，并提交了，此时T1事务在来查数据，得到了数据2，这就叫不可重复读
 *       幻读：T1事务读取了表中的一个字段，然后T2事务在表中插入了一些新的行，T1事务在去读取的时候，就会多出几行，这就叫幻读
 *
 *一个事务与其他事务隔离的程度称为隔离级别，数据库规定了多种事务隔离级别，不同隔离级别对应不同的干扰程度，隔离级别越高，数据一致性就越好，但是并发性越弱
 *
 * 数据库的四种隔离级别
 *       READ UNCOMMITED(读未提交数据):允许事务读取未被其他事务提交的变更、脏读、不可重复读和幻读的问题都会出现
 *       READ COMMITED(读已提交数据):只允许事务读取已经被其他事务提交的变更，可以避免脏读，但不可以避免重复读和幻读
 *       REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值，在这个事务持期间，禁止其他事务对这个字段进行更新，可以避免脏读和不可重复读，但是幻读的问题依然存在
 *       SERIALIZABLE(串行化):确保事务可以从一个表中读取相同的行，在这个事务持续期间，禁止其他事务对该表执行插入、更新和删除操作，所有并发问题都可以避免，但是性能十分低下
 *
 *
 * Java中设置隔离级别
 *   conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED)
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 * */
public class TransactionTest {
}
